#include "PhanSo.h"


PhanSo::PhanSo()
{
	tu = new int;
	mau = new int;
	*tu = 1;
	*mau = 1;
}

PhanSo::PhanSo(int argTu, int argMau)
{
	*tu = argTu;
	*mau = argMau;
}

PhanSo::PhanSo(const PhanSo &objPhanSo)
{
	tu = new int;
	mau = new int;
	*tu = *objPhanSo.tu;
	*mau = *objPhanSo.mau;
}


PhanSo::~PhanSo()
{
	delete tu;
	delete mau;
}


int PhanSo::SetTu(int argTu)
{
	*tu = argTu;
	return 1;//thiet lap thanh cong
}

int PhanSo::SetMau(int argMau)
{
	if (argMau == 0) return 0;//thiet lap khong thanh cong
	*mau = argMau;
	return 1;//thiet lap thanh cong
}

int PhanSo::GetTu() const
{
	return *tu;
}

int PhanSo::GetMau() const
{
	return *mau;
}

int PhanSo::RutGon()
{
	int r;
	int varTu = *tu;
	int varMau = *mau;
	//tim uoc chung lon nhat
	do
	{
		r = varTu % varMau;
		varTu = varMau;
		varMau = r;
	} while (r != 0);
	//rut gon
	*tu = *tu / varTu;
	*mau = *mau / varTu;
	return 1;// rut gon thanh cong
}

void PhanSo::Nhap()
{
	int varMau;
	cout << "Nhap vao tu so: ";
	cin >> *tu;
	do
	{
		cout << "Nhap mau so: ";
		cin >> varMau;
	} while (!SetMau(varMau));//thiet lap khong thanh cong nhap lai
}

void PhanSo::Xuat()
{
	cout << *tu << " / " << *mau;
}

PhanSo PhanSo::operator =(const PhanSo &praPhanSo)
{
	*tu = *praPhanSo.tu;
	*mau = *praPhanSo.mau;
	return *this;
}

PhanSo PhanSo::operator+ (const PhanSo &praPhanSo) const
{
	PhanSo varTemp;
	*varTemp.tu = *tu * praPhanSo.GetMau() + *mau * praPhanSo.GetTu();
	*varTemp.mau = *mau * praPhanSo.GetMau();
	varTemp.RutGon();
	return varTemp;
}

PhanSo PhanSo::operator - (const PhanSo &praPhanSo) const
{
	PhanSo varTemp;
	*varTemp.tu = *tu * praPhanSo.GetMau() - *mau * praPhanSo.GetTu();
	*varTemp.mau = *mau * praPhanSo.GetMau();
	varTemp.RutGon();
	return varTemp;
}

PhanSo PhanSo::operator * (const PhanSo &praPhanSo) const
{
	PhanSo varTemp;
	*varTemp.tu = *tu * praPhanSo.GetTu();
	*varTemp.mau = *mau * praPhanSo.GetMau();
	varTemp.RutGon();
	return varTemp;
}

PhanSo PhanSo::operator / (const PhanSo &praPhanSo) const 
{
	PhanSo varTemp;
	if (praPhanSo.GetTu() != 0)
	{
		*varTemp.tu = *tu * praPhanSo.GetMau();
		*varTemp.mau = *mau * praPhanSo.GetTu();
	}
	varTemp.RutGon();
	return varTemp;
}

PhanSo PhanSo::operator +=(const PhanSo &praPhanSo)
{
	*tu = *tu * praPhanSo.GetMau() + praPhanSo.GetTu() * *mau;
	*mau = *mau * praPhanSo.GetMau();
	this->RutGon();
	return *this;
}

PhanSo PhanSo::operator +=(int praInt)
{
	*tu = *tu + praInt * *mau;

	this->RutGon();
	return *this;
}

PhanSo PhanSo::operator -=(const PhanSo &praPhanSo)
{
	*tu = *tu * praPhanSo.GetMau() - praPhanSo.GetTu() * *mau;
	*mau = *mau * praPhanSo.GetMau();
	this->RutGon();

	return *this;
}

PhanSo PhanSo::operator -=(int praInt)
{
	*tu = *tu - praInt * *mau;
	this->RutGon();

	return *this;
}

PhanSo PhanSo::operator *=(const PhanSo &praPhanSo)
{
	*tu = *tu * praPhanSo.GetTu();
	*mau = *mau * praPhanSo.GetMau();

	this->RutGon();

	return *this;
}

PhanSo PhanSo::operator *=(int praInt)
{
	*tu = *tu * praInt;

	this->RutGon();

	return *this;
}

PhanSo PhanSo::operator /=(const PhanSo &praPhanSo)
{
	if (praPhanSo.GetTu() != 0)
	{
		*tu = *tu * praPhanSo.GetMau();
		*mau = *mau * praPhanSo.GetTu();
		this->RutGon();
	}
	return *this;
}

PhanSo PhanSo::operator /=(int praInt)
{
	if (praInt != 0)
	{
		*mau = *mau * praInt;
		this->RutGon();
	}

	return *this;
}

bool PhanSo::operator ==(const PhanSo &praPhanSo) const
{
	if (*tu * praPhanSo.GetMau() == *mau * praPhanSo.GetTu()) return true;
	
	return false;
}

bool PhanSo::operator !=(const PhanSo &praPhanSo) const 
{
	if (*tu * praPhanSo.GetMau() != *mau * praPhanSo.GetTu()) return true;

	return false;
}

bool PhanSo::operator >(const PhanSo &praPhanSo) const
{
	if (*tu / (float)*mau > praPhanSo.GetTu() / (float)praPhanSo.GetMau()) return true;

	return false;
}

bool PhanSo::operator <(const PhanSo &praPhanSo) const
{
	if (*tu / (float)*mau < praPhanSo.GetTu() / (float)praPhanSo.GetMau()) return true;

	return false;
}

bool PhanSo::operator >=(const PhanSo &praPhanSo) const
{
	if (*tu / (float)*mau >= praPhanSo.GetTu() / (float)praPhanSo.GetMau()) return true;

	return false;
}

bool PhanSo::operator <=(const PhanSo &praPhanSo) const
{
	if (*tu / (float)*mau <= praPhanSo.GetTu() / (float)praPhanSo.GetMau()) return true;

	return false;
}

